/**
 * Created by zybang on 2017/6/28.
 * 位运算实现加减法
 */
public class addBinary {
    public static void main(String [] args){
            System.out.print(~1);
    }


    /**
     * ^进行加法
     * &记录移位
     * @param a
     * @param b
     * @return
     */
    private static int testAdd(int a, int b){
        int result = a^b;
        int j = a&b;
        while (j!=0){
            int tempA = result;
            int tempB = j<<1;
            result = tempA^tempB;
            j = tempA&tempB;

        }

        return result;
    }


    /**
     * 主要思想是将减法转换为加法，使用~位运算符
     * 因为~5=-6   所以要先对减数转换为负数做一次运算
     *
     * @param a   被减数
     * @param b   减数
     * @return
     */
    private static int minus(int a, int b){
        return testAdd(a,testAdd(~b, 1));
    }


    /**
     *除法
     * 除法的意义就在于：求a可以由多少个b组成。
     * 那么由此我们可得除法的实现：求a能减去多少个b，做减法的次数就是除法的商。
     * 采用递归
     */
    private static int sub(int a,int b) {
        int res=-1;
        if(a<b){
            return 0;
        }else{
            res=sub(minus(a, b), b)+1;
        }
        return res;
    }


    /**
     * 可以看到，二进制乘法的原理是：
     * 从乘数的低位到高位，遇到1并且这个1在乘数的右起第i（i从0开始数）位，那么就把被乘数左移i位得到 temp_i 。
     * 直到乘数中的1遍历完后，把根据各位1而得到的被乘数的左移值们 temp_i 相加起来即得乘法结果。
     * 那么根据这个原理，可以得到实现代码：
     * 这里要点为：用i记录当前遍历的乘数位,当前位为1则被乘数左移i位并加到和中，同时i++处理下一位；为0则乘数右移，i++，
     * 处理下一位......直到乘数==0说明乘数中的1遍历完了。此时把和返回即可。
     * @param a
     * @param b
     * @return
     */
    private static int multi(int a,int b){
        int i=0;
        int res=0;
        while(b!=0){//乘数为0则结束
            //处理乘数当前位
            if((b&1)==1){
                res+=(a<<i);
                b=b>>1;
                ++i;//i记录当前位是第几位
            }else{
                b=b>>1;
                ++i;
            }
        }
        return res;
    }
}
